﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using ENT.GP.Core;
using ENT.GP.Core.Lookup;
using Ext.Net;
using System.Configuration;
using entgp.Code;
using ENT.GP.Core.Proyecto;
using ENT.GP.Core.Core;

public partial class Proyectos_CreacionProyectos_wucProyecto : ControlesUsuario
{

    protected void Page_Load(object sender, EventArgs e)
    {
        try
        {
            if (!IsPostBack)
            {


                TipoLookup.InvalidateCache();
                EjesLookup.InvalidateCache();
                ProgramaLookup.InvalidateCache();
                EstadoProyectoLookup.InvalidateCache();
                IndicadoresLookup.InvalidateCache();
                EntidadLookup.InvalidateCache();
                RegionLookup.InvalidateCache();
                SectorLookup.InvalidateCache();
                PoblacionAfectadaLookup.InvalidateCache();
                MonedaLookup.InvalidateCache();

                sPoblacionAfectada.DataSource = PoblacionAfectadaLookup.GetNameValueList(IdEmp);
                sPoblacionAfectada.DataBind();

                stoMoneda.DataSource = MonedaLookup.GetNameValueList(this.IdEmp);
                stoMoneda.DataBind();
                
                sRegion.DataSource = RegionLookup.GetNameValueList(ConfigurationManager.AppSettings.Get("CodigoRegionSenplades").ToString(), this.IdEmp);
                sRegion.DataBind();
                sSectores.DataSource = SectorLookup.GetNameValueList(this.IdEmp);
                sSectores.DataBind();
                sTipo.DataSource = TipoLookup.GetNameValueList(this.IdEmp);
                sTipo.DataBind();
                sEstadoProyecto.DataSource = EstadoProyectoLookup.GetNameValueList(this.IdEmp);
                sEstadoProyecto.DataBind();
                sEjes.DataSource = EjesLookup.GetNameValueList(this.IdEmp);
                sEjes.DataBind();
                sPrograma.DataSource = ProgramaLookup.GetNameValueList(this.IdEmp);
                sPrograma.DataBind();
                sEntidad.DataSource = EntidadLookup.GetNameValueList(this.IdEmp);
                sEntidad.DataBind();
                //int IdProy = Convert.ToInt32(Request.QueryString.Get("IdP"));
                //CargarDatos(IdProy);

                //
                cbxPrograma.FieldLabel = ManejadorRecursos.GetRecurso("LblPrograma");
                cbxEjes.FieldLabel = ManejadorRecursos.GetRecurso("LblEje");

            }
        }
        catch (Exception ex)
        {
            System.Text.Encoding encod = System.Text.Encoding.UTF8;
            System.IO.FileStream log = System.IO.File.Open(ConfigurationManager.AppSettings.Get("PathLog"), System.IO.FileMode.Append);
            log.Write(encod.GetBytes(ex.Message + Environment.NewLine), 0, encod.GetByteCount(ex.Message + Environment.NewLine));
            log.Close();
        }
    }

    public void Show(int Id, string operacion)
    {
        Show(Id);
        btnSiguiente.Hide();
        btnEliminar.Show();
        btnGuardar.Hide();
        
    }

    public void Show(int Id)
    {
        btnSiguiente.Show();
        btnEliminar.Hide();
        btnGuardar.Show();
        CargarDatos(Id);
        winProyectos.Show();
    }

    #region Carga de datos Basicos del proyecto y Guardar los mismos
    /// <summary>
    /// Cargar los datos del proyecto
    /// </summary>
    /// <param name="Id"></param>
    void CargarDatos(int Id)
    {
        Proyecto objProyecto = Proyecto.GetProyecto(Id);
        hidIdPerfilProyecto.Text = Id.ToString();
        DateTime fi, ff;
        DateTime.TryParse(objProyecto.FechaInicio.ToString(), out fi);
        DateTime.TryParse(objProyecto.FechaFin.ToString(), out ff);
        dFechaDesde.SelectedDate = fi;
        dFechaHasta.SelectedDate = ff;
        hidAI.Text = fi.Year.ToString();
        hidAF.Text = ff.Year.ToString();
        hidMI.Text = fi.Month.ToString();
        hidMF.Text = ff.Month.ToString();
        hidDI.Text = fi.Day.ToString();
        hidDF.Text = ff.Day.ToString();
        txtDuracionProy.SetValue(objProyecto.DuracionProy);
        txaNombreProyecto.SetValue(objProyecto.Nombre);
        txaDescripcion.SetValue(objProyecto.DescripcionAdicional);
        cbxEjes.SetValue(objProyecto.Eje);
        cbxPrograma.SetValue(objProyecto.Programa);
        cbxEstadoProy.SetValueAndFireSelect(objProyecto.Estado);
        //nfPorcentajeA.Text = objProyecto.PorcentajeAvance.ToString();
        txtObEstado.Text = objProyecto.Observacion;
        txtObjGeneral.Text = objProyecto.ObjetivoGeneral;
        txtObjEspecifico.Text = objProyecto.ObjetivoEspecifico;
        int valorAvance;
        int.TryParse(objProyecto.PorcentajeAvance.ToString(), out valorAvance);
        //sliPorcentaje.Value = valorAvance;
        //Informacion financiera
        nfInversionTotal.Number = objProyecto.CostoTotal;
        stoInversionistas.DataSource = objProyecto.Inversiones;
        stoInversionistas.DataBind();
        //Informacion Estados proyectos
        sProyectoEstados.DataSource = objProyecto.Estados;
        sProyectoEstados.DataBind();

        //Localizacion
        txtLatitud.Number = Math.Round( objProyecto.Latitud,8);
        txtLongitud.Number = Math.Round(objProyecto.Longitud, 7);

        sRegion.DataSource = RegionLookup.GetNameValueList(ConfigurationManager.AppSettings.Get("CodigoRegionSenplades").ToString(), this.IdEmp);
        sRegion.DataBind();
        CargarProvincias(objProyecto.Region);
        CargarCantones(objProyecto.Provincia);
        cbxRegion.SetValue(objProyecto.Region);
        cbxProvincia.SetValue(objProyecto.Provincia);
        cbxCanton.SetValue(objProyecto.Canton);
        txtParroquia.Text = (objProyecto.Parroquia);
        sPoblacionAfectada.DataSource = PoblacionAfectadaLookup.GetNameValueList(IdEmp);
        sPoblacionAfectada.DataBind();
        nfNHabitantes.Number = objProyecto.NumeroHabitantes;

        cbxPoblacionAfectada.SetValue(objProyecto.PoblacionAfectada);
        sCoordinacion.DataSource = objProyecto.Coordinadores;
        sCoordinacion.DataBind();
        StoreDocumentos.DataSource = objProyecto.DocumentosPerfil;
        StoreDocumentos.DataBind();
        StoreDocumentosDP.DataSource = objProyecto.DocumentosPerfilDictamen;
        StoreDocumentosDP.DataBind();
        StoreDocumentosVT.DataSource = objProyecto.DocumentosPerfilViabilidad;
        StoreDocumentosVT.DataBind();
        StoreSector.RemoveAll();
        StoreSector.DataSource = objProyecto.Sectores;
        StoreSector.DataBind();
        sSectores.RemoveAll();
        sSectores.DataSource = SectorLookup.GetNameValueList(this.IdEmp);
        sSectores.DataBind();
        X.Js.Call("MarcarSectores");
        string urlUbicacion = string.Format("{0}Georeferencial/UbicacionMapa.aspx?IdP={1}", ConfigurationManager.AppSettings.Get("PathServer"), Id);
        pnlMapa.LoadContent(urlUbicacion, true);
        //fsUbicacionMapa.LoadContent(urlUbicacion,true);
        
    }
    /// <summary>
    /// Invoca metodo para actualizar datos de la grid
    /// </summary>
    private static void CallRefreshGridParent()
    {
        X.Js.AddScript("var storeTmp=#{StoreProyectos}; if (storeTmp!=null) storeTmp.load();");
    }
    /// <summary>
    /// Eliminar los datos del proyecto
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    public void btnEliminar_Click(object sender, DirectEventArgs e)
    {
        try
        {
            int IdProy = Convert.ToInt32(e.ExtraParams["hidIdPerfilProyecto_prm"]);//int IdProy = Convert.ToInt32(hidIdPerfilProyecto.Text);
            var proyecto = Proyecto.GetProyecto(IdProy);
            proyecto.Delete();
            proyecto = proyecto.Save();
            X.Msg.Show(new MessageBoxConfig
            {
                Title = "Eliminación de proyecto",
                Message = "El proyecto se elimino correctamente",
                Buttons = MessageBox.Button.OK,
                Icon = MessageBox.Icon.INFO
            });
            LimpiarFormulario();
            CallRefreshGridParent();
        }
        catch (Exception ex)
        {
            X.Msg.Show(new MessageBoxConfig
            {
                Title = "Error",
                Message = "Error al eliminar proyecto",
                Buttons = MessageBox.Button.OK,
                Icon = MessageBox.Icon.ERROR
            });
            Util.RegistarLog(ex.ToString());
        }
    }
    /// <summary>
    /// Guardar los datos del proyecto
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    public void btnGuardar_Click(object sender, DirectEventArgs e)
    {
      
        GuardarDatos(e);
        CallRefreshGridParent();
    }
    /// <summary>
    /// Recoge todos los campos para guardarlos en la base de datos
    /// </summary>
    /// <param name="jsonCoordinadores"></param>
    private void GuardarDatos(DirectEventArgs e)
    {
        try
        {
            Proyecto proyecto;
            string jsonCoordinador = e.ExtraParams["Coordinadores"];
            string jsonSectores = e.ExtraParams["Sectores"];
            string jsonInversiones = e.ExtraParams["Inversionistas"];
            string jsonEstados = e.ExtraParams["Estados"];
            int IdProy = Convert.ToInt32(e.ExtraParams["hidIdPerfilProyecto_prm"]);//hidIdPerfilProyecto.Text
            if (IdProy > 0)
                proyecto = Proyecto.GetProyecto(IdProy);
            else
                proyecto = Proyecto.NewProyecto();

            //Datos Generales
            proyecto.Nombre = e.ExtraParams["txaNombreProyecto_prm"];//txaNombreProyecto.Text;//
            proyecto.DescripcionAdicional = e.ExtraParams["txaDescripcion_prm"];//txaDescripcion.Text;//

            //proyecto.FechaInicio = new DateTime(Convert.ToInt32(hidAI.Text), Convert.ToInt32(hidMI.Text), Convert.ToInt32(hidDI.Text));
            proyecto.FechaInicio = new DateTime(Convert.ToInt32(e.ExtraParams["hidAI_prm"]), Convert.ToInt32(e.ExtraParams["hidMI_prm"]), Convert.ToInt32(e.ExtraParams["hidDI_prm"]));
            //proyecto.FechaFin = new DateTime(Convert.ToInt32(hidAF.Text), Convert.ToInt32(hidMF.Text), Convert.ToInt32(hidDF.Text));
            proyecto.FechaFin = new DateTime(Convert.ToInt32(e.ExtraParams["hidAF_prm"]), Convert.ToInt32(e.ExtraParams["hidMF_prm"]), Convert.ToInt32(e.ExtraParams["hidDF_prm"]));

            proyecto.DuracionProy = Int32.Parse(e.ExtraParams["txtDuracionProy_prm"]);//txtDuracionProy.Text
          
            //Proyecto Estados
            StoreDataHandler sdhEstados = new StoreDataHandler(jsonEstados);
            ChangeRecords<ProyectoEstado> crsdhEstados = sdhEstados.ObjectData<ProyectoEstado>();

            foreach (var estado in crsdhEstados.Deleted)
            {
                int indice = proyecto.Estados.IndexOf(proyecto.Estados.FirstOrDefault(x => x.Id == estado.Id));
                if (indice != -1)
                    proyecto.Estados.RemoveAt(indice);
            }

            foreach (var estado in crsdhEstados.Updated)
            {
                int indice = proyecto.Estados.IndexOf(proyecto.Estados.FirstOrDefault(x => x.Id == estado.Id));
                Csla.Data.DataMapper.Map(estado, proyecto.Estados[indice]);
            }

            foreach (var estado in crsdhEstados.Created)
            {
                proyecto.Estados.Add(estado);
            }
            proyecto.Estado = Convert.ToInt32(e.ExtraParams["cbxEstadoProy_prm"]);//cbxEstadoProy.SelectedItem.Value
            proyecto.Observacion = e.ExtraParams["txtObEstado_prm"];//txtObEstado.Text
            //proyecto.PorcentajeAvance = Convert.ToDouble(e.ExtraParams["nfPorcentajeA_prm"]);//nfPorcentajeA.Text
            proyecto.Latitud = Convert.ToDouble(e.ExtraParams["txtLatitud_prm"]);//txtLatitud.Number
            proyecto.Longitud = Convert.ToDouble(e.ExtraParams["txtLongitud_prm"]);//txtLongitud.Number

            //Area Poblacion Afectada

            proyecto.PoblacionAfectada = Convert.ToInt32(e.ExtraParams["cbxPoblacionAfectada_prm"]);//cbxPoblacionAfectada.SelectedItem.Value

            //Localizacion
            proyecto.Region = Convert.ToInt32(e.ExtraParams["cbxRegion_prm"]);//cbxRegion.SelectedItem.Value
            proyecto.Provincia = Convert.ToInt32(e.ExtraParams["cbxProvincia_prm"]);//cbxProvincia.SelectedItem.Value
            proyecto.Canton = Convert.ToInt32(e.ExtraParams["cbxCanton_prm"]);//cbxCanton.SelectedItem.Value
            proyecto.Parroquia = e.ExtraParams["txtParroquia_prm"];//txtParroquia.Text
            proyecto.NumeroHabitantes = Convert.ToDouble( e.ExtraParams["nfNHabitantes_prm"]);// nfNHabitantes.Number
            //Sector Estartegico

            StoreDataHandler sdhSectores = new StoreDataHandler(jsonSectores);
            ChangeRecords<ProyectoSector> crSectores = sdhSectores.ObjectData<ProyectoSector>();
            foreach (var sector in crSectores.Deleted)
            {
                int indice = proyecto.Sectores.IndexOf(proyecto.Sectores.FirstOrDefault(x => x.Id == sector.Id));
                if (indice!=-1)
                proyecto.Sectores.RemoveAt(indice);
            }
            foreach (var sector in crSectores.Created)
            {
                proyecto.Sectores.Add(sector);
            }

            proyecto.Eje = Convert.ToInt32(e.ExtraParams["cbxEjes_prm"]);//cbxEjes.SelectedItem.Value
            proyecto.Programa = Convert.ToInt32(e.ExtraParams["cbxPrograma_prm"]);//cbxPrograma.SelectedItem.Value

            //Objetivos
            proyecto.ObjetivoGeneral = e.ExtraParams["txtObjGeneral_prm"];//txtObjGeneral.Text
            proyecto.ObjetivoEspecifico = e.ExtraParams["txtObjEspecifico_prm"];//txtObjEspecifico.Text
            proyecto.NumeroHabitantes = Convert.ToDouble(e.ExtraParams["nfNHabitantes_prm"]);//nfNHabitantes.Number

            //Proyecto Coordinadores
            StoreDataHandler sdhCoordinadores = new StoreDataHandler( jsonCoordinador);
            ChangeRecords<ProyectoCoordinador> crsdhCoordinadores = sdhCoordinadores.ObjectData<ProyectoCoordinador>();

            foreach (ProyectoCoordinador coordinador in crsdhCoordinadores.Deleted)
            {
                int indice = proyecto.Coordinadores.IndexOf(proyecto.Coordinadores.FirstOrDefault(x => x.Id == coordinador.Id));
                if (indice != -1)
                proyecto.Coordinadores.RemoveAt(indice);
            }

            foreach (ProyectoCoordinador coordinador in crsdhCoordinadores.Created)
            {
                proyecto.Coordinadores.Add(coordinador);
            }

            foreach (ProyectoCoordinador coordinador in crsdhCoordinadores.Updated)
            {
                int indice = proyecto.Coordinadores.IndexOf(proyecto.Coordinadores.FirstOrDefault(x => x.Id == coordinador.Id));
                if (indice != -1)
                Csla.Data.DataMapper.Map(coordinador, proyecto.Coordinadores[indice]);
            }

            #region Datos de información financiera
            
            //Descripcion Aporte
            proyecto.CostoTotal = Convert.ToDouble(e.ExtraParams["nfInversionTotal_prm"]);// nfInversionTotal.Number;

            //Informacion Financiera del proyecto
            StoreDataHandler sdhInversiones = new StoreDataHandler(jsonInversiones);
            ChangeRecords<ProyectoInversion> crsdhInversiones = sdhInversiones.ObjectData<ProyectoInversion>();

             foreach (var inversion in crsdhInversiones.Deleted)
             {
                    int indice = proyecto.Inversiones.IndexOf(proyecto.Inversiones.FirstOrDefault(x => x.Id == inversion.Id));
                    proyecto.Inversiones.RemoveAt(indice);
              }

              foreach (var inversion in crsdhInversiones.Updated)
              {
                    int indice = proyecto.Inversiones.IndexOf(proyecto.Inversiones.FirstOrDefault(x => x.Id == inversion.Id));
                    Csla.Data.DataMapper.Map(inversion, proyecto.Inversiones[indice]);
              }

              foreach (var inversion in crsdhInversiones.Created)
              {
                    proyecto.Inversiones.Add(inversion);
              }
           
            #endregion
            
            proyecto = proyecto.Save();

            X.Msg.Show(new MessageBoxConfig
            {
                Title = "Proyectos",
                Message = "El proyecto se guardo correctamente",
                Buttons = MessageBox.Button.OK,
                Icon = MessageBox.Icon.INFO
            });
            LimpiarFormulario();
        }
        catch (Exception ex)
        {
            X.Msg.Show(new MessageBoxConfig
            {
                Title = "Error",
                Message = "Error al guardar proyecto",
                Buttons = MessageBox.Button.OK,
                Icon = MessageBox.Icon.ERROR
            });
            Util.RegistarLog(ex.ToString());
        }
    }
    
  
    #endregion

    #region Cargar datos de Localizacion
    private void CargarCantones(int Id)
    {
        CantonLookup.InvalidateCache();
        this.sCanton.DataSource = CantonLookup.GetNameValueList(Id);
        this.sCanton.DataBind();
    }
    private void CargarProvincias(int Id)
    {
        ProvinciaLookup.InvalidateCache();
        this.sProvincia.DataSource = ProvinciaLookup.GetNameValueList(Id);
        this.sProvincia.DataBind();
    }
    protected void CantonRefresh(object sender, StoreRefreshDataEventArgs e)
    {
        try
        {
            var prov = e.Parameters["Provincia"];
            int p;
            int.TryParse(prov, out p);
            CargarCantones(p);
        }
        catch { }
    }
    protected void ProvinciaRefresh(object sender, StoreRefreshDataEventArgs e)
    {
        try
        {
            var reg = e.Parameters["Region"];
            int r;
            int.TryParse(reg, out r);
            CargarProvincias(r);
        }
        catch { }
    }
    #endregion

    #region Utilidades

    /// <summary>
    /// Limpia el formulario
    /// </summary>
    void LimpiarFormulario()
    {
        dFechaHasta.SelectedDate = new DateTime(2500, 01, 01);
        txaNombreProyecto.Reset();
        txtDuracionProy.Reset();
        txaDescripcion.Reset();
        txtDuracionProy.Reset();
        //txtInversionTotal.Reset();
        txtObEstado.Reset();
        txtObjEspecifico.Reset();
        txtObjGeneral.Reset();
        //txtPorcenContraparte.Reset();
        //txtPorcenContraparte2.Reset();
        //txtPorcenPlan.Reset();
        //txtValContraparte.Reset();
        //txtValContraparte2.Reset();
        //txtValPlan.Reset();
        cbxRegion.Reset();
        txtObEstado.Reset();
        cbxProvincia.Reset();
        cbxPrograma.Reset();
        txtLatitud.Reset();
        txtLongitud.Reset();
        cbxEstadoProy.Reset();
        cbxEjes.Reset();
        cbxCanton.Reset();
        txtParroquia.Reset();
        sCoordinacion.RemoveAll();
        //Adicionales
        txtTipoDocumento.Text = "";
        fufArchivosPP.SetValue("");

        winProyectos.Hide();
    }

    #endregion

    #region Metodos para subir archivos

    protected void CommandVer_Click(object sender, DirectEventArgs e)
    {
        try
        {
            string ruta = string.Format("{0}{1}", UtilP.RUTA_ARCHIVOS, e.ExtraParams["Nombre"]);

            winVerArchivo.LoadContent(ruta,true);
            winVerArchivo.SetTitle(e.ExtraParams["Nombre"]);

            winVerArchivo.Show();
        }
        catch (Exception ex)
        {
            Util.RegistarLog(ex.ToString());
        }
    }

    /// <summary>
    /// Subir un archivo al proyecto
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    public void SubirArchivo_Click(object sender, DirectEventArgs e)
    {
        string tpl = "Subido el archivo Correctamente: {0}<br/>Size: {1} bytes";
        try
        {
            string nombre = "";
            nombre = fufArchivosPP.PostedFile.FileName;
            nombre = UtilP.FormarNombre(nombre);
            fufArchivosPP.PostedFile.SaveAs(MapPath(string.Format("~/{0}{1}", ConfigurationManager.AppSettings.Get("PathFiles"), nombre)));
            fufArchivosPP.SetValue(nombre);

            if (this.fufArchivosPP.HasFile)
            {
                X.Msg.Show(new MessageBoxConfig
                {
                    Buttons = MessageBox.Button.OK,
                    Icon = MessageBox.Icon.INFO,
                    Title = "Éxito",
                    Message = string.Format(tpl, this.fufArchivosPP.PostedFile.FileName, this.fufArchivosPP.PostedFile.ContentLength)
                });

                hiTipoDoc.SetValue(this.fufArchivosPP.PostedFile.ContentType);
                hiTamano.SetValue(this.fufArchivosPP.PostedFile.ContentLength);
                hiRuta.SetValue(nombre);
                hiTipo.SetValue(txtTipoDocumento.Text);
            }
            else
            {
                X.Msg.Show(new MessageBoxConfig
                {
                    Buttons = MessageBox.Button.OK,
                    Icon = MessageBox.Icon.ERROR,
                    Title = "Fallo",
                    Message = "Archivo no fue subido!!!"
                });
            }
        }
        catch(Exception ex)
        {
            Util.RegistarLog(ex.ToString());
            X.Msg.Show(new MessageBoxConfig
            {
                Buttons = MessageBox.Button.OK,
                Icon = MessageBox.Icon.ERROR,
                Title = "Fallo",
                Message = "Archivo no fue subido!!!"
            });
        }
    }

    #endregion

}
